# -*- coding:utf-8 -*-

# @Time    : 2023/8/13 02:24
# @Author  : yaodong
# @Email   : yaodong@lingxi.ai
# @File    : ProductInfoExtract.py
# @Software: LLM_internal

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
import asyncio
import os

import pandas as pd

from bot.insurance_planner_gpt.agent.base_agent import LLMAgent

curPath = os.path.abspath(os.path.dirname(__file__))

gpt_template = """
你是一个AI助手，擅长因果发现,分析以下案例，构建出其所包含的因果图（用X：Y表示，其中X为因，Y为果 Y里面包含产品名称)，在输出的因果图中，需求是因，产品条款或产品属性是果，
你的任务是基于保险产品提取出用户的问题和保险产品中用来解决该问题的条款或方案 其中用户问题是因产品方案是果：
1.最好站在用户的角度看待这款保险产品，用户有什么样的问题才会使用这个保险产品中的服务，请一步一步思考再输出 输出的结果简单点，尽量通俗易懂，但是不要捏造。
2.用户的所有需求全部罗列清楚，不要漏掉。切记保险名称不要错误

其中'==='后是保险产品说明，不要被示例和模板影响，记住只使用'==='之间的内容来提取。需要注意以下信息：

示例（任务忽略）：
保险产品的说明为:
---
保险名称：卓越馨选医疗保险（2023版）-普通版计划一
保险公司：平安保险
承保年龄：50-85周岁

（可选）附加住院定额给付A款医疗保险
包含：
1.重大疾病住院津贴保险金
2.中度疾病住院津贴保险金
3.轻度疾病住院津贴保险金
4.意外住院津贴保险金

---
输出的结果:
   需要平安保险的产品：卓越馨选医疗保险（2023版）-普通版计划一（保险产品名称）-> 保险公司：平安保险
   50-85周岁需要投保：卓越馨选医疗保险（2023版）-普通版计划一（保险产品名称）-> 承保年龄：50-85周岁
   需要重大疾病住院津贴：卓越馨选医疗保险（2023版）-普通版计划一（保险产品名称）->（可选）附加住院定额给付A款医疗保险
   需要中度疾病住院津贴：卓越馨选医疗保险（2023版）-普通版计划一（保险产品名称）->（可选）附加住院定额给付A款医疗保险
   需要轻度疾病住院津贴：卓越馨选医疗保险（2023版）-普通版计划一（保险产品名称）->（可选）附加住院定额给付A款医疗保险
   需要意外住院津贴：卓越馨选医疗保险（2023版）-普通版计划一（保险产品名称）->（可选）附加住院定额给付A款医疗保险
示例结束;

保险产品的说明为:
===
{insurance_product_doc}
===
根据保险产品说明，逐项逐步推理出所有需要提取的内容，未提及，提取不到或未知的不要返回，确保每项信息都没有遗漏，返回提取到的信息：
"""


class ProductInfoExtract(LLMAgent):

    def __init__(self, insurance_product_doc):
        if not insurance_product_doc:
            insurance_product_doc = ''
        self.insurance_product_doc = insurance_product_doc

        self.gpt_prompt_content = gpt_template.format(insurance_product_doc=self.insurance_product_doc)
        super().__init__(self.gpt_prompt_content)

    def process_all_dir(self):
        self.folder_path = curPath + "/embedding_base/insurance_planner_gpt_bge"


if __name__ == '__main__':
    folder_path = curPath + "/raw_data/insurance_knowledge"
    # docpaths = [docname for docname in os.listdir(folder_path)
    #             if not docname.startswith('.') and not docname.endswith('txt')]
    docpaths = [ '“乐游全球“境外旅行保障计划','勇者无惧意外险2021版','小蜜蜂（轻享版）综合意外险']
    product_docs = []
    for doc in docpaths:
        docpath = os.path.join(folder_path, doc)
        for file in os.listdir(docpath):
            filename = file.replace('.txt', '')
            filepath = os.path.join(docpath, file)
            with open(filepath, 'r', encoding='utf-8') as f:
                if not filepath.endswith('txt'):
                    continue
                contents = f.read()
                paragraphs = contents.split('\n\n')
                paragraphs.append("保险产品:" + filename)
                product_casual_extract = ProductInfoExtract(paragraphs)
                result = asyncio.run(product_casual_extract.achat_auto_llm(type='gpt'))
                product_content = {
                    "filename": filename,
                    "result": result
                }
                product_docs.append(product_content)

    df = pd.DataFrame(product_docs, columns=['name', 'result'])
    df.to_excel('output.xlsx', index=False)
